package net.uni.ap.dao;
/**
 * @version 1.2, 04/21/09
 * @since 1.6
 */
import java.io.Serializable;
import java.sql.Connection;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import net.uni.ap.exp.DAOException;
import net.uni.util.Page;

import org.springframework.jdbc.core.RowMapper;

/**
 * 持久层基本的接口定义 所有的DAO接口都必须继承该接口
 *@param <T> 泛型
 */
public interface IBaseDAO<T> {
	/**
	 * @param object
	 * @throws DAOException
	 * @方法说明 保存对象
	 * @date 2011-11-24
	 * @author 孙伟
	 */
	public void create(T object) throws DAOException;
	public void create(Class<?> clazz, Object object)throws DAOException;
	public void myTest(Object o);

	/**
	 * @param object
	 * @throws DAOException
	 * @方法说明 传入entityname
	 * @date 2012-4-18
	 * @author 孙伟
	 */
	public void createByEntity(T object) throws DAOException;
	
	/**
	 * @param object
	 * @throws DAOException
	 * @方法说明 传入entityname
	 * @date 2012-4-18
	 * @author 孙伟
	 */
	public void updateByEntity(T object) throws DAOException;
	
	/**
	 * @param object
	 * @throws DAOException
	 * @方法说明 修改对象
	 * @date 2011-11-24
	 * @author Administrator
	 */
	public void update(T object) throws DAOException;
	public void update(Class<?> clazz, Object object) throws DAOException;

	public void saveOrUpdate(T object) throws DAOException;
	public void saveOrUpdateAll(Collection<T> entities)  throws DAOException;
	/**
	 * @param id 要删除对象的ID
	 * @throws DAOException
	 * @方法说明 通过id删除对象
	 * @date 2011-11-24
	 * @author Administrator
	 */
	public void delete(Serializable id) throws DAOException;
	/**
	 * @param 
	 * @throws DAOException
	 * @方法说明 删除对象
	 * @date 2011-11-24
	 * @author 孙伟
	 */
	public void delete(List<Long> entityList) throws DAOException;
	
	public void deleteByEntity(Class<?> clazz,Serializable id)throws DAOException;

	/**
	 * @param ids 需要删除的对象id数组
	 * @throws DAOException
	 * @方法说明 批量删除对象
	 * @date 2011-11-24
	 * @author Administrator
	 */
	public void delete(Serializable ids[]) throws DAOException;
	public void deleteByEntity(Class<?> clazz,Serializable ids[])throws DAOException;
	public void delete( T object) throws DAOException;

	/**
	 * 对象不存在时返回空
	 * @param id
	 * @return
	 * @throws DAOException
	 * @方法说明 通过id获取对象
	 * @date 2011-11-24
	 * @author Administrator
	 */
	public T getObject(Serializable id) throws DAOException;
	public <X> X getObject( Class<X> clazz,  Serializable id) throws DAOException;

	/**
	 * @param id
	 * @return
	 * @throws DAOException
	 * @方法说明 通过id获取对象 对象不存在时抛出异常
	 * @date 2011-11-24
	 * @author Administrator
	 */
	public T loadObject(Serializable id) throws DAOException;

	/**
	 * @return
	 * @throws DAOException
	 * @方法说明
	 * @date 2011-12-5
	 * @author HeDroid
	 */
	public List<T> getList() throws DAOException;
	public List<T> getList(String[] params,Object[] values) throws DAOException;

	public Page findByEntity(T instance,Page page) throws DAOException;
	
	/**
	 * @param sql 查询sql
	 * @param param 按照绑定变量的map，为<变量名，变量值>的map
	 * @return	查询的Object的集合
	 * @throws DAOException
	 * @方法说明
	 * @date 2011-11-29
	 * @author HeDroid
	 */
	public List  getListMapBySql( String sql, Map<String,Object> param) throws DAOException;
	
	/**
	 * @param sql sql
	 * @param page 分页对象
	 * @param args 参数
	 * @return
	 * @throws DAOException
	 * @方法说明  返回分页对象，分页对象里面list里面放的是map，键是字段名称，值是对应字段值
	 * @date 2012-10-15
	 * @author 孙伟
	 */
	public Page findPageMapBySql(String sql,Page page,Object[] args) throws DAOException;
	
	/**
	 * @param sql语句
	 * @param page分页
	 * @param args参数数组
	 * @param rowMapper自定义接口，实现RowMapper<T>，用于结果循环赋值
	 * @return
	 * @方法说明 jdbc分页查询
	 * @date 2011-12-21
	 * @author 孙伟
	 */
	public Page findBySql(String sql,Page page,Object[] args,RowMapper<T> rowMapper) throws DAOException;
	
	/**
	 * @param sql
	 * @param args参数
	 * @param argTypes参数类型
	 * @return 
	 * @throws DAOException
	 * @方法说明jdbc查询获取数据总量 
	 * @date 2011-12-21
	 * @author 孙伟
	 */
	public int findCount(String sql,Object[] args) throws DAOException;
	
	/**
	 * @param page 分页对象
	 * @param orderByProName 需要排序的字段java属性名称，默认是降序
	 * @param id 需要查询数据的主键id值，可以为null
	 * @return 返回B表的分页数据
	 * @throws DAOException
	 * @方法说明 B表数据统一查询方法
	 * @date 2012-1-13
	 * @author 孙伟
	 */
	public Page selectHisData(Page page,String orderByProName,Long id) throws DAOException;
	
	/**
	 * @param entityList 修改或者删除那条记录的主键ID的list
	 * @return 插入条数
	 * @throws DAOException
	 * @方法说明 删除或者修改主表数据的时候，调用此方法往B表插入多条数据
	 * @date 2012-1-13
	 * @author 孙伟
	 */
	public int saveHisData(List<Long> entityList) throws DAOException;
	/**
	 * @param id 表的主键
	 * @return 插入条数
	 * @throws DAOException
	 * @方法说明 删除或者修改主表数据的时候，调用此方法往B表插入一条记录
	 * @date 2012-1-13
	 * @author 孙伟
	 */
	public int saveHisData(Long id) throws DAOException;
	
	/**
	 * @param entityList 修改或者删除那条记录的主键ID的数组
	 * @return 插入条数
	 * @throws DAOException
	 * @方法说明 删除或者修改主表数据的时候，调用此方法往B表插入多条数据
	 * @date 2012-1-13
	 * @author 孙伟
	 */
	public int saveHisData(Long[] entityList) throws DAOException;
	
	/**
	 * @param dataIds 数据主键和版本号，例如1234,1;4567,2
	 * @return
	 * @throws DAOException
	 * @方法说明 验证数据是否过期
	 * @date 2012-8-22
	 * @author 孙伟
	 */
	public boolean baseCheckDataValid(String dataIds) throws DAOException;
	
	/**
	 * @方法说明 将缓存数据写入数据库
	 * @date 2013-1-17
	 * @author 孙伟
	 */
	public void flush();
	
	/**
	 * 
	 * 
	 * @方法说明 清空查询缓存
	 * @date 2013-7-23
	 * @author 刘青
	 */
	public void clear();
	
	/**
	 * 
	 * @return
	 * @throws DAOException
	 * @方法说明 获取系统年月	
	 * @date 2013-4-22
	 * @author 刘青
	 */
	public Integer getSystemMonth()throws DAOException;

	/**
	 * 
	 * @param joinId
	 * @param type
	 * @return
	 * @throws DAOException
	 * @方法说明 
	 * @date 2013-7-26
	 * @author 刘青
	 */
	public String batchOperSql(String joinId,Integer type)throws DAOException;
	/**
	 * 根据sequence名称获取下一个值
	 * @return 如果参数为空则返回null
	 * @throws DAOException
	 */
	public Long getNextSequenceByName(String seqName) throws DAOException;
	
	public Connection get()throws DAOException;
}